#include <vcl.h>
#include <EIC.h>
#pragma hdrstop

#include "CListBox.h"
#include "CGBox.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck est utilisé pour être sûr que les composants créés ne
// contiennent aucune fonction virtuelle pure.
//
static inline void ValidCtrCheck(CListBox *)
    {
    new CListBox(NULL);
    }



namespace Clistbox
    {
    void __fastcall PACKAGE Register()
        {
        TComponentClass classes[1] = {__classid(CListBox)};
        RegisterComponents("EIC Ctrlstd", classes, 0);
        }
    }

//////////////////////////////////////
//
// CListBox
//
// Fonction: Constructeur
//
// P.E.:
//
// P.S.: AUCUN
//
//////////////////////////////////////
__fastcall CListBox::CListBox(TComponent* Owner)
    : TCustomListBox(Owner)
    {
    FLibelleFont = 0;
    FReadOnly                   = false;
    inherited::Enabled          = true;
    inherited::Color            = COL_EDIT_LISTBOX;
    inherited::Visible          = true;
    inherited::TabStop          = true;

    FSizeEsp                    = ECART_LIBEL_LISTBOX;
    FpfnOnEstCorrectementRempli = NULL;
    OldWndProc_Parent           = NULL;
    FOldParent                  = NULL;

    try
        {
        FLibelleFont            = new TFont();
        FLibelleFont->Assign( Font );
        LLibelle                = new TLabel( this );
        LLibelle->Transparent   = true;
        Libelle                 = "";
        LLibelle->FocusControl  = this;
		    FLibelleFont->OnChange  = LibelleFontChange;
		    IsEcranChaine			= true;
        RafraichirFond(this);
        }

    catch(...)
        {
        }
    }



__fastcall CListBox::~CListBox()
{
  delete FLibelleFont;
  FLibelleFont = 0;

  if( FOldParent && OldWndProc_Parent)
    FOldParent->WindowProc = OldWndProc_Parent;
}



void __fastcall CListBox::SetParent(TWinControl* AParent)
{
    if( OldWndProc_Parent)
    {
      FOldParent->WindowProc = OldWndProc_Parent;
      OldWndProc_Parent = NULL;
      FOldParent = NULL;
    }
    inherited::SetParent( AParent);
    if( AParent)
    {
      OldWndProc_Parent   = AParent->WindowProc;
      FOldParent = AParent;
      AParent->WindowProc = WndProc_Parent;
    }
}
//////////////////////////////////////
//
// SetEnabled
//
// Fonction: Initialise Enabled
//
// P.E.: Enabled
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::SetEnabled( bool bEnabled )
    {
    inherited::Enabled      = bEnabled;
    if( LLibelle )
        LLibelle->Enabled   = bEnabled;

    if( bEnabled )
        SetReadOnly( FReadOnly );

    else RafraichirFond(this);

    Font->Color = !bEnabled ? clGrayText : clBlack;
    }


//////////////////////////////////////
//
// SetLibelle
//
// Fonction: Initialise le Libelle
//
// P.E.: le Libelle
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::SetLibelle( const AnsiString aLibelle )
    {
    FLibelle = aLibelle;

    if( LLibelle )
        {
        LLibelle->Visible    = Visible;
        LLibelle->Enabled    = Enabled;
        LLibelle->Parent     = Parent;
        LLibelle->Font       = LibelleFont;
        LLibelle->Caption    = FLibelle;
        LLibelle->Alignment  = taRightJustify;
        LLibelle->Top        = Top - 10 - 4;
		LLibelle->Left       = Left;
        }
    }



//////////////////////////////////////
//
// SetLibelleFont
//
// Fonction: Initialise la fonte du Libelle
//
// P.E.: LibelleFont
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::SetLibelleFont( TFont *FFont )
    {
    FLibelleFont->Assign( FFont );
    }

//////////////////////////////////////
//
// SetReadOnly
//
// Fonction: Initialise la ListBox en lecture seule ou en lecture/ecriture
//           Repaint le fond en fonction de sa valeur
//
// P.E.: ReadOnly
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::SetReadOnly( bool bReadOnly )
    {
    FReadOnly           = bReadOnly;
    inherited::TabStop  = !bReadOnly;
    RafraichirFond(this);
    }



//////////////////////////////////////
//
// SetSizeEsp
//
// Fonction: Initialise la taille de l'espace entre le Libelle et l'Edit
//
// P.E.: La taille
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::SetSizeEsp( int iSizeEsp )
    {
    FSizeEsp = iSizeEsp;

    if( LLibelle )
        LLibelle->Left = Left - LLibelle->Width - FSizeEsp;
    }



//////////////////////////////////////
//
// GetEnabled
//
// Fonction: Renvoie Enabled
//
// P.E.: AUCUN
//
// P.S.: Enabled
//
//////////////////////////////////////
bool __fastcall CListBox::GetEnabled()
    {
    return( inherited::Enabled );
    }



TFont * __fastcall CListBox::GetLibelleFont() const
    {
    return( FLibelleFont );
    }



//////////////////////////////////////
//
// LibelleFontChange
//
// Fonction: Initialise la fonte du libelle avec la nouvelle fonte choisie
//
// P.E.:
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::LibelleFontChange( TObject *Sender )
    {
    if( LLibelle )
        {
        LLibelle->Font->Assign( FLibelleFont );
        LLibelle->Top = Top - 10 - 4;
        }
    }



////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                                                                            //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////
void __fastcall CListBox::KeyDown( Word &Key, Classes::TShiftState Shift)
	{
	int                     DropDownCount;
	Classes::TShiftState 	ShiftTemp;

	DropDownCount	= Height / ItemHeight;
	ShiftTemp 		= ShiftTemp << ssCtrl;

	if( IsEcranChaine )
		{
		switch( Key )
			{
			case VK_NEXT:
				{
				if( Shift == ShiftTemp )
					ItemIndex = (ItemIndex + DropDownCount - 1 < Items->Count )? (ItemIndex + DropDownCount - 1) : (Items->Count - 1);
				Key = VK_CANCEL;
				break;
				}

			case VK_PRIOR:
				{
				if( Shift == ShiftTemp )
					ItemIndex = (ItemIndex - DropDownCount + 1 >= 0 )? (ItemIndex - DropDownCount + 1) : 0;
				Key = VK_CANCEL;
				break;
				}
			}
		}
	}




//////////////////////////////////////
//
// KeyPress
//
// Fonction: Change la selection courante
//
// P.E.:
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::KeyPress( char &Key )
	{
	if( !ReadOnly )
		inherited::KeyPress( Key );
	}



//////////////////////////////////////
//
// WndProc
//
// Fonction: Capture les messages
//
// P.E.: Les messages
//
// P.S.: AUCUN
//
//////////////////////////////////////
void __fastcall CListBox::WndProc( TMessage &Message )
{
	switch( Message.Msg )
	{
		case WM_SETFOCUS:
		{
			if( !ComponentState.Contains( csDesigning ))
			{
				if( ReadOnly )
				{
					Message.Msg = WM_NULL;
					::SetFocus( Parent->Handle );
        }
      }
      break;
		}

    case WM_LBUTTONDBLCLK:
    {
      inherited::DblClick();
      break;
    }

    case WM_ENABLE:
    {
      Enabled = (bool)Message.WParam;
      break;
    }

    case WM_READONLY:
    {
      ReadOnly = (bool)Message.WParam;
      break;
    }

    case WM_WINDOWPOSCHANGED:
    {
      if( LLibelle )
      {
        inherited::WndProc( Message );
        LLibelle->Left  = Left;
				LLibelle->Top   = Top - 10 - 4;
        Message.Msg = WM_NULL;
      }
      break;
    }
  }

  inherited::WndProc( Message );
}

void __fastcall CListBox::WndProc_Parent( TMessage &Message )
{
    OldWndProc_Parent( Message );
	  if( (Message.Msg == WM_COMMAND) && ( Message.WParamHi == LBN_SELCHANGE) )
      RafraichirFond(this);
}

void __fastcall CListBox::SetObligatoire( bool bObligatoire)
{
  FObligatoire = bObligatoire;
  RafraichirFond(this);
}

bool __fastcall CListBox::EstCorrectementRempliDefault( void)
{
  return( ItemIndex != -1);
}

void __fastcall CListBox::SetBleuSiHint( bool bBleuSiHint)
{
  FBleuSiHint = bBleuSiHint;
  RafraichirFond(this);
}
